﻿
//系统配置信息
window.config = {
	baseUrl : process.env.API_URL, //后台服务地址
	debug : (process.env.NODE_ENV=="development"),  //只在开发环境下开启debug模式
	skipUrl : process.env.SKIP_URL, //跳转路径
};

//localStorage的key值
window.lsKey = {
	token : "token", //登录标志码    ["token值", "sessionId"]
	message : "message", //监听storage事件的信息载体
};

//sessionStorage的key值
window.ssKey = {
	sessionId : "sessionId", //会话标志
};

//信息提示
window.tips = {
	blank : "请完善必填字段",
	name : "请输入1~10位汉字,字母,数字组成的姓名",
	phone : "请输入正确的手机号",
	password : "请输入6~14位数字字母组成的密码",
	captcha : "请输入短信验证码",
	integer : "请输入正整数",
	classname:'请输入有效的班级名称'
}

//工具对象
window.tool = {};

//tool在App.vue加入了 message,alert,confirm,prompt,msgbox,notify属性
//保存element-ui提供的弹窗对象


/* @target 项目初始化处理
 */
tool.init = function() {
	//不是调试模式,关闭浏览器的日志打印
	if(!config.debug) {
		console.log = function() {};
	}
	//设置屏幕自适应
	window.rem = screen.width / 19.2;
	var html = document.documentElement;
	html.style.fontSize = rem + "px";
}

/* @target 判断常用类型的值是否符合规则
 * @param type 类型
 * @param value 值
 * @return true 符合 / false 不符合
 */
tool.judge = function(type,value) {
	
	var flag = null;
	switch(type) {
		case "name" : //姓名: 汉字开头,2~6位汉字或·
//			flag = /^[\u4E00-\u9FA5][\u4E00-\u9FA5·]{1,5}$/.test(value);
					 //姓名: 汉字和字母组成,1~10个字符以内
			flag = /^[0-9a-zA-Z\u4E00-\u9FA5]{1,10}$/.test(value);
			break;
		case "phone" : //手机号: 1开头,11位数字
			flag = /^1[0-9]{10}$/.test(value);			
			break;
		case "password" : //用户密码: 6~14位数字或字母
			flag = /^[0-9a-zA-Z]{6,14}$/.test(value);
			break;
		case "integer" : //正整数(不含0)	   
			flag = /^[1-9]\d*$/.test(value);
			break;
		case "integer0" : //正整数(含0)
            flag = /^([1-9]\d*|0)$/.test(value);
            break;
		case "positiveFloat"://正浮点数(不含0)
			flag = /^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/.test(value);
		    break;
		case "classname" ://班级名称 
			flag = /^[a-zA-Z0-9-_|()|\u4e00-\u9fa5|（）]{2,19}$/.test(value);
			break;
		case "empty" : //非空字符串
		    flag=(value!=="");		  
		    break;
	}
	return flag;
}

tool.isChrome = function(){
	//判断内核,如果不是webkit内核,进行提示
	var agent = navigator.userAgent.toLowerCase(); // 取得浏览器的userAgent字符串z
	console.log(agent);
	var isChrome = agent.indexOf("webkit") > -1 && agent.indexOf("chrome") > -1; //是否是谷歌浏览器
	return isChrome;
}

/* @target 检验表单字段是否符合规则
 * @param obj 表单数据对象 (表单元素必须带data-field属性才能非空检查)
 * @param rules 自定义规则数组 [{express:规则表达式,focus:不符合时焦点元素选择器,msg:不符合时提示信息}]
 * @return true 符合 / false 不符合
 */
tool.validate = function(rules) {
	//自定义验证规则检查
	for(var i in rules) {
		var r = rules[i];
		//不符合规则
		if(!r.judge) {
			//获取焦点
			if(r.focus) {
				console.log(r.focus);
				r.focus.focus();
			}
			//弹出提示
			if(r.tips) {
				tool.message({showClose:true, type: 'warning',
							  message:r.tips,duration:3000});
			}
			return false;
		}
	}
	return true;
}

//根据字符截取后面的字符串
tool.getCaption=function(str,c){
    var index=str.lastIndexOf(c);
    str=str.substring(index+1,str.length);

    return str;
}

/* @target 日期对象转字符串
 * @example 年-月-日 时:分:秒:毫秒
 * 		yyyy-MM-dd HH:mm:ss:SSS → 2018-08-08 08:08:08:888
 * 		yy-M-d H:m:s → 18-8-8 8:8:8
 * @param day : 目标日期
 * @param split : 分隔符,不传默认.号
 * @return 日期字符串
 */
tool.DateToString = function(day,format) {
	var year = day.getFullYear();
	var month = day.getMonth()+1;
	var date = day.getDate();
	var hour = day.getHours();
	var hour12 = (hour>12? hour-12 : hour);
	hour12 = (hour12==0? 12 : hour12);
	var minute = day.getMinutes();
	var second = day.getSeconds();
	var milliSecond = day.getMilliseconds();
	
	return format.replace("yyyy" , year)
				 .replace("yy" , new String(year).substring(2))
				 .replace("MM" , month<10? "0"+month : month)
				 .replace("M" , month)
				 .replace("dd" , date<10? "0"+date : date)
				 .replace("d" , date)
				 .replace("hh" , hour12<10? "0"+hour12 : hour12)
				 .replace("h" , hour12)
				 .replace("HH" , hour<10? "0"+hour : hour)
				 .replace("H" , hour)
				 .replace("mm" , minute<10? "0"+minute : minute)
				 .replace("m" , minute)
				 .replace("ss" , second<10? "0"+second : second)
				 .replace("s" , second)
				 .replace("SSS",milliSecond);
}



/* @target 加密字符串
 * @param str 明文
 * @return 密文
 */
tool.encode = function(str) {
	return window.btoa(unescape(encodeURIComponent(str)));
}

/* @target 解密字符串
 * @param str 密文明文
 * @return 明文
 */
tool.decode = function(str) {
	//密文有可能被破坏导致报异常
	try {
		return decodeURIComponent(escape(window.atob(str)));
	} catch(err) {
		return null;
	}
}

/* @target 加密后缓存数据
 * @param key 键
 * @param value 值
 * @param isJson 值是否对象
 */
tool.setItem = function(key,value,isJson) {
	//如果是json对象则转字符串
	value = (isJson? JSON.stringify(value) : value);
	//键和值都加密
	key = tool.encode(key);
	value = tool.encode(value);
	//保存
	localStorage.setItem(key,value);
}

/* @target 读取缓存的加密数据
 * @param key 键
 * @param isJson 值是否对象
 * @return 值
 */
tool.getItem = function(key,isJson) {
	//加密键,获取值
	key = tool.encode(key);
	var value = tool.decode(localStorage.getItem(key));
	
	//如不为空且是json对象则转换
	if(value!=null && isJson) {
		try {
			value = JSON.parse(value);
		} catch(err) {
			value = null;
		}
	}
	return value;
}

/* @target 删除缓存的加密数据
 * @param key 值
 */
tool.removeItem = function(key) {
	key = tool.encode(key);
	var value = localStorage.removeItem(key);
}


/* @target 复制对象
 * @param obj 被复制的对象
 * @return 新对象
 */
tool.clone = function(obj) {
	//日期格式
	if(obj instanceof Date) {
		return new Date(obj.valueOf());
	}
	//json格式
	return JSON.parse(JSON.stringify(obj));
}

/* @target 获取唯一编号uuid
 * @return uuid
 */
tool.uuid = function() {
	//7位 16进制随机数
	var random = (((1+Math.random())*0x10000000)|0).toString(16).substring(1);
	//13位 当前时间毫秒数
	var time = new Date().getTime();
	return time + random;
}

/* @target 将数据字典数组转对象
 * @param arry 数字字典数组
 * @return 数据字典对象
 */
tool.parseDict = function(arry) {
	var obj = {};
	arry.forEach(function(item) {
		obj[item.value] = item.name;
	});
	return obj;
}

/* @target 计算当前日期减目标日期相差几年几月几天
 * @param someDay : 目标日期(字符串或日期对象)
 * @return "xx岁xx月xx天"
 */
tool.minusDate = function(someDay) {
	
	if(someDay==null || someDay=="") {
		return "";
	}
	someDay = tool.StringToDate(someDay);
	var date = new Date();
	//当前年月日减该日期年月日
	var y = date.getFullYear() - someDay.getFullYear();
	var m = date.getMonth() - someDay.getMonth();
	var d = date.getDate() - someDay.getDate();
	//日期或月份为负数则向前借位
	if(d<0) {
		m--;
		d += 30
	}
	if(m<0) {
		y--;
		m += 12;
	}
	return y+"岁"+m+"月";
	
}

/* @target 根据某日期,获取对应字符串
 * @param day : 目标日期
 * @param split : 分隔符
 * @return 日期字符串
 */
tool.StringToDate = function(date) {
	if(typeof date != "string") {
		return date;
	}
	//ios支持yyyy/m/d格式，不支持.和-的这种格式
	date = date.replace(/\./g,"/").replace(/-/g,"/");
	return new Date(date);
}

/* @target 转换对象中的属性值
 * @param value1 : 原本的值
 * @param value2 : 目标的值
 * @param obj : 待转换的对象
 * @param fields : 字符串数组,要转换的属性,如 ["a","b.b1"]
 */
tool.change = function(value1,value2,obj,fields) {
	fields.forEach(function(field) {
		//直接更改一级属性
		if(field.indexOf(".") < 0) {
			if(isEqual(obj[field])) {
				obj[field] = value2;
			}
			return;
		}
		
		var a = field.split(".")[0];
		var b = field.split(".")[1];
		var son = obj[a];
		//如果属性是数组
		if(son instanceof Array) {
			//遍历数组,更改数组元素的属性的值
			son.forEach(function(item) {
				if(isEqual(item[b])) {
					item[b] = value2;
				}
			})
		} else {
			//不是数组,默认是对象,属性的值
			if(isEqual(son[b])) {
				son[b] = value2;
			}
		}
		
	})
	
	function isEqual(val) {
		if(value1 instanceof RegExp) {
			return value1.test(val);
		} else {
			return value1 === val;
		}
	}
}


